const { app } = require('electron');
const windowManager = require('./utils/window-manager');
const { registerIpcHandlers } = require('./ipc/handlers');

/**
 * Electron 应用主入口
 */
class CCloudApp {
    constructor() {
        this.isReady = false;
        this.isQuitting = false;
        
        this.setupAppEvents();
    }

    /**
     * 设置应用事件
     */
    setupAppEvents() {
        // 应用准备就绪
        app.whenReady().then(() => {
            this.onAppReady();
        });

        // 所有窗口关闭事件
        app.on('window-all-closed', () => {
            this.onWindowAllClosed();
        });

        // 应用激活事件 (macOS)
        app.on('activate', () => {
            this.onActivate();
        });

        // 应用即将退出
        app.on('before-quit', () => {
            this.isQuitting = true;
        });
    }

    /**
     * 应用准备就绪处理
     */
    async onAppReady() {
        try {
            // 注册 IPC 处理器
            registerIpcHandlers();
            
            // 创建主窗口
            windowManager.createMainWindow();
            
            this.isReady = true;
        } catch (error) {
            console.error('[App] 应用启动失败:', error);
            app.quit();
        }
    }

    /**
     * 所有窗口关闭处理
     */
    onWindowAllClosed() {
        // 在 macOS 上，除非用户用 Cmd + Q 确定地退出，
        // 否则绝大部分应用及其菜单栏会保持激活
        if (process.platform !== 'darwin') {
            app.quit();
        }
    }

    /**
     * 应用激活处理 (macOS)
     */
    onActivate() {
        // 当 dock 图标被点击且没有窗口打开时，
        // 在应用程序中重新创建窗口
        const { BrowserWindow } = require('electron');
        if (BrowserWindow.getAllWindows().length === 0) {
            windowManager.createMainWindow();
        }
    }

    /**
     * 安全退出应用
     */
    async quit() {
        if (!this.isQuitting) {
            this.isQuitting = true;
            
            // 清理资源
            windowManager.closeAllWindows();
            
            // 延迟退出以确保清理完成
            setTimeout(() => {
                app.quit();
            }, 100);
        }
    }
}

// 创建应用实例
const ccloudApp = new CCloudApp();

// 处理未捕获的异常
process.on('uncaughtException', (error) => {
    console.error('[App] 未捕获的异常:', error);
    if (!ccloudApp.isQuitting) {
        app.quit();
    }
});

process.on('unhandledRejection', (reason, promise) => {
    console.error('[App] 未处理的 Promise 拒绝:', reason);
});

module.exports = CCloudApp;